import sys
# para leer argumentos de programa
import os
# para ejecutar comandos
GLOBALParticipantes = []
# global con los participantes

def capturar(imagen = "",dispositivo = "/dev/video0"):
	os.system("rm temporal.txt")
	if(imagen == ""):
		os.system("fswebcam -d "+ dispositivo +" -r 1000x700 --jpeg 100 salida.jpg")
		os.system("dmtxread -m 1000 salida.jpg >> temporal.txt")
	else:
		print imagen
		os.system("dmtxread -m 1000 "+ imagen +" >> temporal.txt")

def configuracion():
	participantes = []
	#print sys.argv[1]
	#Este archivo interpretable debe ser interpretado en el mismo directorio
	#donde esta el configuracion.ini 
	try: conf = open("configuracion.ini",'r')
	except: 
		print "No existe el archivo configuracion.ini"
		return False
	try: cantidad = int(conf.readline()) 
	except: print "El archivo de configuracion no es valido"
	#Leo la cantidad de valor a cargar
	participantes = [[" " for q in xrange(3)] for x in xrange(cantidad)]
	for i in xrange(cantidad):
		# el archivo tiene formato:
		# CODIGO DE EMPRESA, VALOR DE VOTO, NOMBRE DE EMPRESA
		x = conf.readline()
		participantes[i][0] = int(x[:x.find(',')])
		participantes[i][1] = int(x[x.find(',')+1:x.rfind(',')])
		participantes[i][2] = str(x[x.rfind(',')+1:])
	return participantes


def procesar(participantes):

	votos = []
	#f = open(sys.argv[1])
	#Leo por argumento de programa el archivo a configurar
	f = open("temporal.txt","r")
	while True:
		x = f.readline()
		# leo cada linea que contiene el codigo de empresa y 
		# lo agrego al array
		if x == '': break
		votos.append(int(x))

	total = 0

	# 
	for x in xrange(len(votos)):
		for i in xrange(len(participantes)):
			# print votos[x]," ", participantes[i][0]  
			if(participantes[i][0] == votos[x]):
				total = total + participantes[i][1]
				#print "voto de ", participantes[i][2]
				break
	print "El valor total de la votacion es ", total
	if (len(votos) != len(set(votos))): 
		# Se que es redundante y antimodular, pero esto es UN PROTOTIPO
		print " ALERTA: ALGUIEN TIENE UN CODIGO DUPLICADO " 
		repetidos = [k for k,v in Counter(votos).items() if v>1]
		for x in xrange(len(repetidos)):
			for i in xrange(len(participantes)):
				# print votos[x]," ", participantes[i][0]  
				if(participantes[i][0] == repetidos[x]):
					#total = total + participantes[i][1]
					print "REPETICION de ", participantes[i][2]
					break
					
	print "Total de votantes: ", len(votos)
	Voto_Total = "Cantidad total de puntaje total:" + str(total)
	CantVotantes = "Cantidad total de votantes: " + str(len(votos))

def writeDATAMATRIX(participantes):
	print participantes
	for i in participantes:
		os.system("echo -n "+ str(i[0]) +" | dmtxwrite -o cod"+ str(i[0]) +"-"+ (str(i[2]).replace(' ','_')).replace('\n','') +".png")
		print "Imagen creada para ", i[2]
	

def ayuda():
	print "python (ruta absoluta)/lectorVotos.py [argumento unico]"
	print "				"
	print "Argumentos validos:"
	print "archivo		Ruta del archivo JPG, PNG, GIF"
	print "		o BMP donde se ubica la imagen"
	print "		a ser escaneada en busca de valores"
	print "-h -help	Muestra esta ayuda"
	print "-mas		Muestra la ayuda extendida"
	print "-d DEVICE	Toma imagenes desde dispositivo especificado"
	print "		si no se especifica, es /dev/video0"
	print "-c		Crea un archivo configuracion.ini de ejemplo"
	print "-m		Crea las imagenes con los codigos datamatrix a partir"
	print "		de los datos que se encuentren en configuracion.ini"
	print "		con nombre CODIGO-NOMBREEMPRESA.png"
	print " 					"
	print "REQUISITOS: Para que este programa funcione se debe tener instalado"
	print "fswebcam, y libdmtx. SE RECOMIENDA USAR UNA CAMARA DE ALTA DEFINICION"

def more():
	print "Ayuda extendida: "
	ayuda()
	print "																"
	print "Este programa sirve para contar votos en un ambiente de entre 2 y"
	print "20 metros de profundidad (dependiendo de la camara y lente a usar)"
	print "para contabilizar votos mediante la lectura de codigos DATAMATRIX."
	print "Solo coloque un argumento a la vez"
	print "No olvide modificar el archivo 'configuracion.ini', este archivo "
	print "contiene que codigos seran validos para votar. FORMATO:"
	print "La primer linea es un numero que indica cuantos registros existen"
	print "en el archivo, y cada linea siguiente es un registro. Cada registro"
	print "tiene tres valores separados por coma; el primero indica el codigo"
	print "numerico DATAMATRIX que corresponde a la empresa, el segundo numero"
	print "es el valor de peso de voto de la empresa, el tercero es un string"
	print "que indica el nombre de la empresa. Si hay codigos repetidos en la"
	print "imagen, se informara. "


def main(participantes):
	if(len(sys.argv) > 1):
		if(("-h" in sys.argv) or ("-help" in sys.argv)):
			ayuda()
		elif("-mas" in sys.argv):
			more()
		elif("-d" in sys.argv):
			try:
				capturar("",sys.argv[sys.argv.index("-d") + 1])
				procesar(participantes)
			except: print "ERROR, dispositivo erroneo?"
		elif("-c" in sys.argv):
			try:
				f = open("configuracion.ini","w")
				f.write("3\n")
				f.write("1,1,EmpresA UNO\n")
				f.write("2,1,EmpresA DOS\n")
				f.write("3,1,EmpresA TRES\n")
				f.close()
				print "Se creo archivo de configuracion correctamente en configuracion.ini"
				print "llame a este programa con el argumento -h para conocer el formato"
			except:
				print "No se pudo crear el archivo de configuracion. Tiene permisos para"
				print "escribir en esta carpeta?"
		elif("-m" in sys.argv):
			writeDATAMATRIX(participantes)
		else:
			print "Leyendo desde archivo de imagen"
			capturar(sys.argv[1])
			procesar(participantes)

	else:
		print "Leyendo desde camara web"
		capturar()
		procesar(participantes)

GLOBALParticipantes = configuracion()
if(GLOBALParticipantes == False): 
	print "No se encuentra el archivo de configuracion!!"
	more()
else: main(GLOBALParticipantes)